package protocol

// 此文件，封装一个自己的http server，用来控制程序的启动和优雅关闭
import (
	"context"
	"fmt"
	"net/http"

	"gitee.com/liuxiaowei123/vblog-01/vblog-01/vblog/conf"
	"gitee.com/liuxiaowei123/vblog-01/vblog-01/vblog/ioc"
	"github.com/gin-gonic/gin"
)

type HttpServer struct {
	server *http.Server
}

func NewHttpServer() *HttpServer {
	r := gin.Default()
	// 把api handler对象注册到root router路由中
	// ioc.ApiHandler().RouteRegistry(r)
	ioc.ApiHandler().RouteRegistry(r.Group("/api/vblog"))
	return &HttpServer{
		server: &http.Server{
			// 服务监听的地址
			Addr: fmt.Sprintf("%s:%d", conf.C.Api.Apihost, conf.C.Api.Apiport),
			// 监听关联的路由处理
			Handler: r,
		},
	}
}

// 开启监听
func (h *HttpServer) Run() error {
	// 不能用 fmt.Sprintf("%s:%d", conf.C.Api.Apihost, conf.C.Api.Apiport)
	fmt.Printf("%s:%d", conf.C.Api.Apihost, conf.C.Api.Apiport)
	return h.server.ListenAndServe()
}

// 关闭；关闭时需要操作系统传递信号，所以要传递上下文
func (h *HttpServer) Close(ctx context.Context) {
	h.server.Shutdown(ctx)
}
